home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software of the Month Club 2000 October
/
Software of the Month - Ultimate Collection Shareware 277.iso
/
pc
/
PROGRAMS
/
UTILITY
/
WINLINUX
/
DATA1.CAB
/
programs_-_include
/
LINUX
/
HFMODEM.H
< prev
next >
Wrap
C/C++ Source or Header
|
1999-09-17
|
8KB
|
257 lines
/*****************************************************************************/
/*
* hfmodem.h -- Linux soundcard HF FSK driver.
*
* Copyright (C) 1997 Thomas Sailer (sailer@ife.ee.ethz.ch)
* Swiss Federal Institute of Technology (ETH), Electronics Lab
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*
* This is the Linux realtime sound output driver
*/
/*****************************************************************************/
#ifndef _HFMODEM_H
#define _HFMODEM_H
/* --------------------------------------------------------------------- */
#include <linux/version.h>
#include <linux/ioctl.h>
#include <linux/types.h>
#include <linux/fs.h>
#if LINUX_VERSION_CODE >= 0x20100
#include <linux/poll.h>
#endif
/* --------------------------------------------------------------------- */
#define HFMODEM_MINOR 145
#define HFMODEM_SRATE 8000
#define HFMODEM_MAXBITS 4800 /* required for GTOR 300 baud mode */
#define HFMODEM_MINBAUD 40
#define HFMODEM_MAXBAUD 400
#define HFMODEM_MAXCORRLEN ((HFMODEM_SRATE+HFMODEM_MINBAUD-1)/HFMODEM_MINBAUD)
/* --------------------------------------------------------------------- */
typedef unsigned long hfmodem_time_t;
typedef int hfmodem_soft_t;
typedef unsigned long hfmodem_id_t;
/* --------------------------------------------------------------------- */
struct hfmodem_ioctl_fsk_tx_request {
hfmodem_time_t tstart;
hfmodem_time_t tinc;
int inv;
hfmodem_id_t id;
unsigned int nbits;
unsigned char *data;
unsigned int freq[2];
};
struct hfmodem_ioctl_fsk_rx_request {
hfmodem_time_t tstart;
hfmodem_time_t tinc;
unsigned int baud;
hfmodem_id_t id;
unsigned int nbits;
hfmodem_soft_t *data;
unsigned int freq[2];
};
struct hfmodem_ioctl_mixer_params {
int src;
int igain;
int ogain;
};
struct hfmodem_ioctl_sample_params {
__s16 *data;
int len;
};
#define HFMODEM_IOCTL_FSKTXREQUEST _IOW('H', 0, struct hfmodem_ioctl_fsk_tx_request)
#define HFMODEM_IOCTL_FSKRXREQUEST _IOW('H', 1, struct hfmodem_ioctl_fsk_rx_request)
#define HFMODEM_IOCTL_CLEARRQ _IO('H', 3)
#define HFMODEM_IOCTL_GETCURTIME _IOR('H', 4, hfmodem_time_t)
#define HFMODEM_IOCTL_WAITRQ _IOR('H', 5, hfmodem_id_t)
#define HFMODEM_IOCTL_MIXERPARAMS _IOW('H', 6, struct hfmodem_ioctl_mixer_params)
#define HFMODEM_IOCTL_SAMPLESTART _IOW('H', 7, struct hfmodem_ioctl_sample_params)
#define HFMODEM_IOCTL_SAMPLEFINISHED _IO('H', 8)
/* --------------------------------------------------------------------- */
#ifdef __KERNEL__
#include <linux/parport.h>
#define DMA_MODE_AUTOINIT 0x10
#define NR_DEVICE 1
#define HFMODEM_FRAGSAMPLES (HFMODEM_SRATE/100)
#define HFMODEM_FRAGSIZE (HFMODEM_FRAGSAMPLES*2)
#define HFMODEM_NUMFRAGS 8
#define HFMODEM_EXCESSFRAGS 3
#define HFMODEM_NUMRXSLOTS 20
#define HFMODEM_NUMTXSLOTS 4
#define HFMODEM_CORRELATOR_CACHE 8
enum slot_st { ss_unused = 0, ss_ready, ss_oper, ss_retired };
typedef int hfmodem_conv_t;
struct hfmodem_state {
const struct hfmodem_scops *scops;
/* io params */
struct {
unsigned int base_addr;
unsigned int dma;
unsigned int irq;
} io;
struct {
unsigned int seriobase;
unsigned int pariobase;
unsigned int midiiobase;
unsigned int flags;
struct pardevice *pardev;
} ptt_out;
struct {
__s16 *buf;
unsigned int lastfrag;
unsigned int fragptr;
unsigned int last_dmaptr;
int ptt_frames;
} dma;
struct {
unsigned int last_tvusec;
unsigned long long time_cnt;
hfmodem_time_t lasttime;
#ifdef __i386__
unsigned int starttime_lo, starttime_hi;
#endif /* __i386__ */
} clk;
int active;
struct wait_queue *wait;
struct {
__s16 *kbuf;
__s16 *ubuf;
__s16 *kptr;
unsigned int size;
int rem;
} sbuf;
struct {
hfmodem_time_t last_time;
unsigned int tx_phase;
struct hfmodem_l1_rxslot {
enum slot_st state;
hfmodem_time_t tstart, tinc;
hfmodem_soft_t *data;
hfmodem_soft_t *userdata;
unsigned int nbits;
unsigned int cntbits;
hfmodem_id_t id;
unsigned int corrlen;
hfmodem_conv_t scale;
unsigned int corr_cache;
} rxslots[HFMODEM_NUMRXSLOTS];
struct hfmodem_l1_txslot {
enum slot_st state;
hfmodem_time_t tstart, tinc;
unsigned char *data;
unsigned int nbits;
unsigned int cntbits;
hfmodem_id_t id;
unsigned char inv;
unsigned int phinc;
unsigned int phase_incs[2];
} txslots[HFMODEM_NUMTXSLOTS];
} l1;
};
struct hfmodem_correlator_cache {
int refcnt;
int lru;
unsigned short phase_incs[2];
hfmodem_conv_t correlator[2][2][HFMODEM_MAXCORRLEN];
};
struct hfmodem_scops {
unsigned int extent;
void (*init)(struct hfmodem_state *dev);
void (*prepare_input)(struct hfmodem_state *dev);
void (*trigger_input)(struct hfmodem_state *dev);
void (*prepare_output)(struct hfmodem_state *dev);
void (*trigger_output)(struct hfmodem_state *dev);
void (*stop)(struct hfmodem_state *dev);
unsigned int (*intack)(struct hfmodem_state *dev);
void (*mixer)(struct hfmodem_state *dev, int src, int igain, int ogain);
};
/* --------------------------------------------------------------------- */
extern int hfmodem_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
#if LINUX_VERSION_CODE >= 0x20100
extern unsigned int hfmodem_poll(struct file *file, poll_table *wait);
#else
extern int hfmodem_select(struct inode *inode, struct file *file, int sel_type, select_table *wait);
#endif
extern void hfmodem_clear_rq(struct hfmodem_state *dev);
extern void hfmodem_input_samples(struct hfmodem_state *dev, hfmodem_time_t tstart,
hfmodem_time_t tinc, __s16 *samples);
extern int hfmodem_output_samples(struct hfmodem_state *dev, hfmodem_time_t tstart,
hfmodem_time_t tinc, __s16 *samples);
extern long hfmodem_next_tx_event(struct hfmodem_state *dev, hfmodem_time_t curr);
extern void hfmodem_finish_pending_rx_requests(struct hfmodem_state *dev);
extern void hfmodem_wakeup(struct hfmodem_state *dev);
extern int hfmodem_sbcprobe(struct hfmodem_state *dev);
extern int hfmodem_wssprobe(struct hfmodem_state *dev);
extern void hfmodem_refclock_probe(void);
extern void hfmodem_refclock_init(struct hfmodem_state *dev);
extern hfmodem_time_t hfmodem_refclock_current(struct hfmodem_state *dev, hfmodem_time_t expected, int exp_valid);
/* --------------------------------------------------------------------- */
extern const char hfmodem_drvname[];
extern const char hfmodem_drvinfo[];
extern struct hfmodem_state hfmodem_state[NR_DEVICE];
extern struct hfmodem_correlator_cache hfmodem_correlator_cache[HFMODEM_CORRELATOR_CACHE];
/* --------------------------------------------------------------------- */
#endif /* __KERNEL__ */
/* --------------------------------------------------------------------- */
#endif /* _HFMODEM_H */